package com.hyt.it.ogt.kq.service.bm.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.hyt.it.ogt.kq.service.bm.model.entity.StudentProject;
import com.hyt.it.ogt.kq.service.bm.model.entity.StudentSubject;
import com.hyt.it.ogt.kq.service.bm.model.param.MyExamRecordParam;
import com.hyt.it.ogt.kq.service.bm.model.param.ProjectStudentImportRecordParam;
import com.hyt.it.ogt.kq.service.bm.model.vo.*;
import com.hyt.it.ogt.kq.service.model.vo.wechat.WeChatCandidateArrangeDetailVO;
import com.hyt.it.ogt.kq.service.model.vo.wechat.WeChatCandidateArrangeVO;
import com.hyt.loginfo.model.User;

import java.util.List;
import java.util.Map;
import java.util.Optional;

/**
 * <p>
 * 考生报名表 服务类
 * </p>
 *
 * @author wangt
 * @since 2020-05-15
 */
public interface IStudentProjectService extends IService<StudentProject> {

    /***
     * 根据id查询项目，用户对应的考生信息
     * @return
     */
    StudentProject getProjectStudentById(String studentId);


    List<StudentStatVo> statStudentByHour(ProjectParam param) throws Exception;

    /**
     * 获取用户ID通过考生ID的Map
     *
     * @param studentIds
     * @return Map<UserId, StudentId>
     */
    Map<String, String> getRegIdById(List<String> studentIds);

    /**
     * 获取项目ID通过考生ID的Map
     *
     * @param studentIds
     * @return Map<ProjectId, StudentId>
     */
    Map<String, String> getProjectIdById(List<String> studentIds);


    /**
     * 查询项目，用户对应的考生信息
     *
     * @param projectId
     * @return
     */
    List<StudentProject> getProjectStudents(String projectId);

    /***
     * 查询项目，用户对应的考生信息
     * @param projectId
     * @param regId
     * @return
     */
    StudentProject getProjectStudent(String projectId, String regId);

    List<WeChatCandidateArrangeVO> getWeChatCandidateArrangeVO(String officeId, String regId) throws Exception;

    WeChatCandidateArrangeDetailVO getWeChatCandidateArrangeDetailVO(String projectId, String timeId, String regId) throws Exception;

    List<ProjectStatVo> getEffectivePeoject(List<ProjectStatVo> list, String regId) throws Exception;

    List<ProjectStatVo> getMyProject(String officeId, String regId) throws Exception;

    /**
     * 获取指定用户的考试记录
     *
     * @return
     */
    List<StudentExamRecordVo> myExamRecord(MyExamRecordParam param);

    /**
     * 获取区域下已报名人数
     *
     * @param projectId         报名ID
     * @param areaCollectInfoId 区域采集字段ID
     * @param areaCode          区域code
     * @param deptId
     * @return
     */
    Optional<Integer> countAreaEnrolledNum(String projectId, String areaCollectInfoId, String areaCode, String deptId);

    /**
     * 获取待审核人数
     *
     * @param projectId         报名ID
     * @param areaCollectInfoId 区域采集字段ID
     * @param areaCode          区域code
     * @param deptId
     * @return
     */
    Optional<Integer> countAreaPendingNum(String projectId, String areaCollectInfoId, String areaCode, String deptId);

    /**
     * 获取审核通过人数
     *
     * @param projectId         报名ID
     * @param areaCollectInfoId 区域采集字段ID
     * @param areaCode          区域code
     * @param deptId
     * @return
     */
    Optional<Integer> countAreaPassAuditNum(String projectId, String areaCollectInfoId, String areaCode, String deptId);

    /**
     * 获取审核未通过人数
     *
     * @param projectId         报名ID
     * @param areaCollectInfoId 区域采集字段ID
     * @param areaCode          区域code
     * @param deptId
     * @return
     */
    Optional<Integer> countAreaFailAuditNum(String projectId, String areaCollectInfoId, String areaCode, String deptId);

    /**
     * 获取待缴费人数
     *
     * @param projectId         报名ID
     * @param areaCollectInfoId 区域采集字段ID
     * @param areaCode          区域code
     * @param deptId
     * @return
     */
    Optional<Integer> countAreaUnpaidNum(String projectId, String areaCollectInfoId, String areaCode, String deptId);

    /**
     * 获取已缴费人数
     *
     * @param projectId         报名ID
     * @param areaCollectInfoId 区域采集字段ID
     * @param areaCode          区域code
     * @param deptId
     * @return
     */
    Optional<Integer> countAreaPaidNum(String projectId, String areaCollectInfoId, String areaCode, String deptId);

    /**
     * 获取已报名人数
     *
     * @param projectId 报名ID
     * @param deptId
     * @return
     */
    Optional<Integer> countEnrolledNum(String projectId, String deptId);

    /**
     * 获取待审核人数
     *
     * @param projectId 报名ID
     * @param deptId
     * @return
     */
    Optional<Integer> countPendingNum(String projectId, String deptId);

    /**
     * 获取审核通过人数
     *
     * @param projectId 报名ID
     * @param deptId
     * @return
     */
    Optional<Integer> countPassAuditNum(String projectId, String deptId);

    /**
     * 获取审核未通过人数
     *
     * @param projectId 报名ID
     * @param deptId
     * @return
     */
    Optional<Integer> countFailAuditNum(String projectId, String deptId);

    /**
     * 获取待缴费人数
     *
     * @param projectId 报名ID
     * @param deptId
     * @return
     */
    Optional<Integer> countUnpaidNum(String projectId, String deptId);

    /**
     * 获取已缴费人数
     *
     * @param projectId 报名ID
     * @param deptId
     * @return
     */
    Optional<Integer> countPaidNum(String projectId, String deptId);

    /**
     * 检查报名下是否有考生报名
     *
     * @param projectId
     */
    void checkHasStudent(String projectId);

    /**
     * 当考生付款或退款时计算pay值给bm_student_project
     *
     * @param subjectList
     */
    void ansycSubjectPayStatus(List<StudentSubject> subjectList);

    /**
     * 批量保存导入数据
     *
     * @param importStudentDataVOList
     * @param recordParam
     * @param createFlag
     * @param currentLoginUser
     */
    void batchSaveImportData(String project, List<ImportStudentDataVO> importStudentDataVOList, ProjectStudentImportRecordParam recordParam, Boolean createFlag, User currentLoginUser);
}
